#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <unistd.h>
#include <vector>
using namespace std;

// class Task
// {
// public:
//     Task(int a, int b) : _a(a), _b(b) {}
//     int add()
//     {
//         return _a + _b;
//     }
//     ~Task() {};

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int r) : _r(r) {}
//     int getResult()
//     {
//         return _r;
//     }
//     ~Result() {};

// private:
//     int _r;
// };

// void *thread_func(void *arg)
// {
//     // 新线程分离主线程
//     pthread_detach(pthread_self());

//     const char *thread_name = static_cast<const char *>(arg);
//     Task *t = new Task(10, 20); // new可自动调构造
//     Result *r = new Result(t->add());
//     cout << "我是子线程 我的名字是: " << thread_name << endl;
//     return r;
// }

// int main()
// {
//     pthread_t tid;
//     string arg = "thread - 1";
//     int n = pthread_create(&tid, NULL, thread_func, (void *)arg.c_str());

//     // 主线程分离新线程
//     // pthread_detach(tid);

//     sleep(1);
//     void *res = nullptr;
//     int wait_res = pthread_join(tid, &res);

//     if (wait_res != 0)
//     {
//         cerr << "等待子线程失败" << endl;
//     }

//     else
//     {
//         // 需将res强转然后获取其成员内部私有成员再打印
//         Result *ret = static_cast<Result *>(res);
//         cout << ret->getResult() << endl;
//     }

//     return 0;
// }

// 多线程
void *thread_func(void *arg)
{
    char *name = static_cast<char *>(arg);
    cout << name << endl;
    delete[] name; // name和buffer指向的空间一致，释放name相当于释放buffer
    return nullptr;
}

const int nums = 10;
int main()
{
    pthread_t tid;
    vector<pthread_t> tids; // 数组里保存的是pthread_t

    // 多线程创建
    for (int i = 0; i < nums; i++)
    {
        char *buffer = new char[64];
        snprintf(buffer, 64, "新线程的名字是: %d", i);
        sleep(1);
        int n = pthread_create(&tid, nullptr, thread_func, buffer);
        if (n == 0)
            tids.push_back(tid);
        else
        {
            delete[] buffer; // 创建线程失败时释放内存
            continue;
        }
    }

    // 线程等待
    for (auto &e : tids)
    {
        pthread_join(e, nullptr);
    }
}